//// myfile.c
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//#include <unistd.h>
//#include <sys/types.h>
//#include <sys/stat.h>
//#include <fcntl.h>
//
//int main()
//{
//    umask(0);
//
//    int fd1 = open("log1.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);
//    int fd2 = open("log2.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);
//    int fd3 = open("log3.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);
//    int fd4 = open("log4.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);
//
//    if(fd1 < 0) exit(1);
//    if(fd2 < 0) exit(1);
//    if(fd3 < 0) exit(1);
//    if(fd4 < 0) exit(1);
//
//    printf("fd1: %d\n", fd1);
//    printf("fd2: %d\n", fd2);
//    printf("fd2: %d\n", fd3);
//    printf("fd3: %d\n", fd4);
//
//    close(fd1);
//    close(fd2);
//    close(fd3);
//    close(fd4);
//
//    return 0;
//}
//


//#include <stdio.h>
//#include <sys/types.h>
//#include <sys/stat.h>
//#include <fcntl.h>
//#include <unistd.h>
//
//int main() 
//{
//    // 关闭标准输出(fd=1)
//    close(1); 
//    
//    // 打开一个新文件
//    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    
//    // 打开失败
//    if (fd < 0) 
//    {
//        perror("open");
//        return 1;
//    }
//
//    printf("The new fd is: %d\n", fd);
//
//    fflush(stdout);
//    close(fd);
//    return 0;
//}



//#include <stdio.h>
//#include <fcntl.h>
//#include <unistd.h>
//
//int main() {
//    close(1); // 关键操作：关闭标准输出
//    
//    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//
//    // 下面的printf本应打印到屏幕
//    printf("This message should be in log.txt\n");
//    
//    // 我们故意不关闭fd，以便观察
//    return 0;
//}
//



//#include <stdio.h>
//#include <unistd.h>
//#include <sys/types.h>
//#include <sys/stat.h>
//#include <sys/fcntl.h>
//
//int main() 
//{
//    umask(0);
//    
//    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    // 文件创建失败
//    if(fd == -1) 
//    {
//        perror("open");
//        return 1;
//    }
//
//    // fd是oldfd，1是newfd，让1成为fd的拷贝
//    int ret = dup2(fd, 1);  
//    // 文件重定向失败
//    if(ret == -1) 
//    {
//        perror("dup2");
//        return 1;
//    }
//
//    printf("fd:%d\n", fd);
//    fprintf(stdout, "fd:%d\n", fd);
//    
//    fflush(stdout);
//    close(fd);
//
//    return 0;
//}


//#include <stdio.h>
//#include <string.h>
//#include <unistd.h>
//#include <sys/types.h>
//#include <sys/stat.h>
//#include <sys/fcntl.h>
//
//int main() 
//{
//    umask(0);
//    
//    // 实现输出重定向
//    int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
//    int ret = dup2(fd, 1);  //fd是oldfd，1是newfd，让1成为fd的拷贝
//
//    char* msg = "hello world\n";
//    write(1, msg, strlen(msg));
//    
//    printf("hello world\n");
//
//    fflush(stdout);
//    close(fd);
//
//    return 0;
//}




#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>

int main() 
{
    int fd = open("log.txt", O_RDONLY);
    int ret = dup2(fd, 0);  //输入重定向

    char buf[64];
    // 循环读取
    while(fgets(buf, sizeof(buf) - 1, stdin) != NULL) 
    {
        buf[strlen(buf)] = '\0';
        printf("%s", buf);  //将从stdin中读入的数据(重定向后是log.txt文件)写入到stdout中，也就是在屏幕上打印出来
    }

    close(fd);
    return 0;
}
